import os
import matplotlib.pyplot as plt
from datetime import datetime
import matplotlib.dates as mdates


# 设置字体以支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题


colors = {
    "0": (0, 100, 0),       # 深绿色
    "1": (0, 0, 255),       # 蓝色
    "2": (139, 0, 0),       # 深红色
    "3": (75, 0, 130),      # 深紫色
    "4": (139, 69, 19),     # 深棕色
    "11": (205, 133, 63),    # 深橙色
    "12": (0, 105, 105),     # 深青色
    "13": (139, 0, 139),     # 深洋红色
    "14": (40, 40, 40),      # 深灰色
    "15": (85, 107, 47),     # 深橄榄绿
    "16": (0, 105, 148),     # 深海蓝
    "21": (255, 0, 139),     # 深酒红
    "22": (85, 65, 0),       # 深咖啡色
    "23": (22, 55, 22),     # 深苔藓绿
    "24": (0, 0, 128),       # 深蓝色
    "25": (0, 206, 209),    # 青色
    "26": (102, 205, 170)   # Aquamarine
}


class Show:
    def __init__(self, png_path):
        self.file_path = png_path
        self.save = False
        self.show = False

    def get_setting(self, save, show):
        self.save = save
        self.show = show

    def show_car_mean_speed(self, data):
        # 小客车平均速度
        # 按时间排序
        data.sort(key=lambda x: x["up_time"])
        # 提取数据
        keys = [d['up_time'] for d in data if d["type"] == "1"]
        times = [datetime.strptime(time, '%H:%M') for time in keys]
        mean_speeds = [d['avg_speed'] for d in data if d["type"] == "1"]

        plt.plot(times, mean_speeds, marker='o', linestyle='-', color='r', label='平均速度')
        # # 绘制85分位数线
        # plt.axhline(y=self.p85, color='b', linestyle='--', label='85分位线')

        # 设置X轴为每1小时一个标记
        ax = plt.gca()  # 获取当前的Axes
        fig = ax.figure
        fig.set_size_inches(20, 12)  # 宽度为10英寸，高度为6英寸
        # ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))  # 每1小时一个主要刻度
        ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0, 30], interval=1))  # 每半小时一个主要刻度
        ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))  # 设置时间格式
        plt.gcf().autofmt_xdate()  # 自动调整X轴日期标签的格式

        # 添加标签和标题
        ax.set_xlabel('时间')
        ax.set_ylabel('速度值（米/秒）')
        ax.set_title('小客车全天平均速度统计')

        # 显示图表
        if self.save:
            plt.show()
        # 保存图表到文件
        if self.show:
            output_filename = os.path.join(self.file_path, 'car_mean_speed.png')
            plt.savefig(output_filename, dpi=200)
            # 关闭图表以释放内存
            plt.close()

    def show_car_pass_rate(self, data):
        # 小客车通过率
        # 按时间排序
        data.sort(key=lambda x: x["up_time"])
        # 提取数据
        keys = [d['up_time'] for d in data if d["type"] == "1"]
        times = [datetime.strptime(time, '%H:%M') for time in keys]
        percentages = [d['percentage'] for d in data if d["type"] == "1"]

        plt.plot(times, percentages, marker='o', linestyle='-', color='r', label='通过率')

        # 设置X轴为每1小时一个标记
        ax = plt.gca()  # 获取当前的Axes
        fig = ax.figure
        fig.set_size_inches(20, 12)  # 宽度为10英寸，高度为6英寸
        # ax.xaxis.set_major_locator(mdates.HourLocator(interval=1))  # 每1小时一个主要刻度
        ax.xaxis.set_major_locator(mdates.MinuteLocator(byminute=[0, 30], interval=1))  # 每半小时一个主要刻度
        ax.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))  # 设置时间格式
        plt.gcf().autofmt_xdate()  # 自动调整X轴日期标签的格式

        # 添加标签和标题
        ax.set_xlabel('时间')
        ax.set_ylabel('通过率（%）')
        ax.set_title('小客车通过率')

        # 显示图表
        if self.save:
            plt.show()
        # 保存图表到文件
        if self.show:
            output_filename = os.path.join(self.file_path, 'car_pass_rate.png')
            plt.savefig(output_filename, dpi=200)
            # 关闭图表以释放内存
            plt.close()

    def show_car_pass_time(self, data, ty=False):
        # 通行时间散点图
        ctype_dict = {}
        for d in data:
            if d["type"] not in ctype_dict:
                ctype_dict[d["type"]] = []
            ctype_dict[d["type"]].append(d)
        # 提取数据
        if ty:
            car_keys = [d['down_time'] for d in ctype_dict["1"]]
            car_times = [datetime.strptime(time, '%H:%M') for time in car_keys]
            car_pass_times = [d['drive_time'] for d in ctype_dict["1"]]
            data = {
                'x': car_times,
                'y': car_pass_times
            }
            plt.scatter(data['x'], data['y'], color=[c / 255 for c in colors["1"]], label='车型：' + str(1))  # 绘制散点图
        else:
            for k, v in ctype_dict.items():
                car_keys = [d['down_time'] for d in v]
                car_times = [datetime.strptime(time, '%H:%M') for time in car_keys]
                car_pass_times = [d['drive_time'] for d in v]
                data = {
                    'x': car_times,
                    'y': car_pass_times
                }
                plt.scatter(data['x'], data['y'], color=[c / 255 for c in colors[k]], label='车型：' + str(k))  # 绘制散点图

        # 显示图表
        if self.save:
            plt.show()
        # 保存图表到文件
        if self.show:
            if ty:
                output_filename = os.path.join(self.file_path, 'car_pass_rate.png')
            else:
                output_filename = os.path.join(self.file_path, 'all_pass_rate.png')
            plt.savefig(output_filename, dpi=200)
            # 关闭图表以释放内存
            plt.close()


if __name__ == '__main__':
    PATH = r''
    Show = Show(PATH)
